package com.ylr.base.common.utils;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2023-02-28 14:30:20
 * className: DataUtils 数据处理工具类
 * version: 1.0
 * description:
 */
public class DataUtils {

    /**
     * 数据脱敏
     * @param str 待脱敏数据
     * @return 脱敏结果
     */
    public static String dataMask(String str) {
        return dataMask(str, 3, 4);
    }

    /**
     * 数据脱敏
     * @param str   待脱敏数据
     * @param start 开始下标
     * @param end   结束下标
     * @return 脱敏结果
     */
    public static String dataMask(String str, int start, int end) {
        StringBuilder sb = new StringBuilder(str);
        return dataMaskMath(sb, start, end);
    }

    /**
     * 数据脱敏
     * @param sb    数据缓存对象
     * @param str   待脱敏数据
     * @param start 开始下标
     * @param end   结束下标
     * @return 脱敏结果
     */
    public static String dataMask(StringBuilder sb, String str, int start, int end) {
        replaceStringBuilder(sb, str);
        return dataMaskMath(sb, start, end);
    }

    /**
     * 批量替换StringBuilder对象存储的字符数据，然后删除其他多余字符
     * @param sb     待替换的对象
     * @param values 新添加的值
     */
    public static StringBuilder replaceStringBuilder(StringBuilder sb, String... values) {
        return replaceStringBuilder(sb, 0, values);
    }

    /**
     * 批量替换StringBuilder对象存储的字符数据，然后删除其他多余字符
     * @param sb     待替换的对象
     * @param start  替换开始下标
     * @param values 新添加的值
     */
    public static StringBuilder replaceStringBuilder(StringBuilder sb, int start, String... values) {
        int end = 0;
        for (String value : values) {
            // 替换的结束下标
            end = start + value.length();
            // 替换
            sb.replace(start, end, value);
            // 更新初始下标
            start = end;
        }
        if (sb.length() > end) {
            // 删除其他多余的字符
            sb.delete(end, sb.length());
        }
        return sb;
    }

    /**
     * 数据脱敏操作
     * 保留明文的数据位数：
     *  start：保留前start位
     *  end：  保留后end位
     * <p>
     * 如：
     * <blockquote><pre>
     *  sb: 1234567890
     *  start: 3
     *  end: 4
     *  结果: 123***7890
     * </pre><pre>
     *  sb: 18815140589
     *  start: 2
     *  end: 4
     *  结果: 18*****0589
     * </pre><pre>
     *  sb: 130124198603030914
     *  start: 4
     *  end: 3
     *  结果: 1301***********914
     * </pre></blockquote>
     * @param sb    数据缓存对象
     * @param start 开始下标
     * @param end   结束下标
     * @return 脱敏结果
     */
    private static String dataMaskMath(StringBuilder sb, int start, int end) {
        int size = sb.length() - end;
        for (int i = start; i < size; i++) {
            sb.setCharAt(i, '*');
        }
        return sb.toString();
    }
}
